ijkplayer的编译配置

ijkplayer的编译

先下载
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

checkout ffmpeg
cd ijkplayer-android
./init-android.sh

编译需要,可以配置在 ~/.bashrc中
export ANDROID_NDK = xxx/xxx
export ANDROID_SDK = xxx/xxx

下载完成后,编译ffmpeg
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all 可选择适合的平台

编译完ffmpeg库后,再编译ijkplayer
cd ..
./compile-ijk.sh clean
./compile-ijk.sh all

编译完成后的android/ijkplayer就是一个android工程,可以直接拷贝出来运行,在android/ijkplayer目录下的ijkplayer-armv7a,ijkplayer-arm64等文件夹下的src/main/libs下生成libijkffmpeg.so libijkplayer.so libijksdl.so三个库

ijkplayer 添加支持rtsp rtmp

ijkplayer默认时不支持rtsp的,需要开启配置后重新编译库。

1
2
3
cd ijkplayer-android
cd config
vim module-lite.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
添加
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=sdp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"

修改支持rtp,rtmp
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"

添加
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=tcp"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"

保存后,执行以下命令

1
2
rm module.sh
ln -s module-lite.sh module.sh

然后再重新编译

1
2
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

编译ijkplayer

1
2
./compile-ijk.sh clean
./compile-ijk.sh all

编译完成后将android项目下最新的库拷贝到之前打开的ijkpalyer项目中即可

ijkplayer rtsp 的优化

通过测试发现之前编译的库打开rtsp时延时较大大概在13s左右,可以在ijkpalyer项目的依赖项目ijkplayer-java中,找到IikVideoView.java 文件,在createPlayer方法中添加以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*以下时针对rtsp流的延时优化*/
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "rtsp_transport", "tcp");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-fps", 30);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 30);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_YV12);

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "max-buffer-size", 1024);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 10);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probsize", "4096");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", 100L);

经过优化后可以在1~3内打开rtsp和rtmp连接

rtsp rtmp的测试

测试可以将地址加在SampleMediaListFragment中进行测试

测试的rtsp地址

rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov

测试的rtmp地址 ,没有找到合适的流 所以可以在本地通过nginx-rtmp-module搭建了推送流和点播服务

rtmp://192.168.2.233/live/stream (直播流)
rtmp://192.168.2.233:1935/vod/test2.mp4 (点播)

从测试的效果来看 ijkplayer播放的效果还算比较理想

添加https支持

1
2
3
cd ijkplayer-android
checkout android openssl
./init-android-openssl.sh

编译 openssl

1
2
3
4
5
cd android/contrib

编译 openssl
./compile-openssl.sh clean
./compile-openssl.sh all

编译ffmpeg
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

编译 ijkplayer
./compil-ijk.sh all

编译完成后替换项目中的so库

测试地址

https://media.w3.org/2010/05/sintel/trailer.mp4

坚持原创技术分享,您的支持将鼓励我继续创作!